package einlesenUndDatenverwaltung;

import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JOptionPane;

/**
 * Die Klasse KursListe baut Objekte des Typs Kursliste. Sie fuegt einzelne
 * Kursobjekte hinzu und gibt diese zurueck.
 * 
 * @author (Daniel Uhlig)
 * @version (17.1.2014)
 */
public class KursListe {
	// ein Kursobjekt
	private Kurs kurs;
	// Vector zum Verwalten der einzelnen Kursobjekte
	private Vector<Kurs> kursliste;

	/**
	 * Konstruktor zur Erzeugung von Kurslisten-Objekten.
	 */
	public KursListe() {
		// anlegen eines neuen Vectorobjektes
		kursliste = new Vector<Kurs>();

	}

	/**
	 * Rueckgabe des Vectors Kursliste.
	 * 
	 * @return kursliste
	 */
	public Vector<Kurs> getKursliste() {
		return kursliste;
	}

	/**
	 * Methode zum Setzen des Vectors Kursliste.
	 * 
	 * @param kursliste
	 *            (Vector) die zu setzende Kursliste
	 */
	public void setKursliste(Vector<Kurs> kursliste) {
		this.kursliste = kursliste;
	}

	/**
	 * Methode zum Hinzufuegen eines Vectors Kursliste zum Vector Kursliste.
	 * 
	 * @param kl
	 *            (Kursliste) - die hinzu zu fuegende Kursliste
	 */
	public void addKursListeToKursListe(KursListe kl) {

		kursliste.addAll(kl.getKursliste());

	}

	/**
	 * Methode zum Hinzufuegen von Kursobjekten.
	 * 
	 * @param kurs
	 *            (Kurs) Kurs der hinzugefuegt werden soll
	 */
	public void addElement(Kurs kurs) {
		// Abfrage ob ein Objekt schon im Vector enthalten ist.
		if (!kursliste.contains(kurs)) {
			// Hinzufuegen des Objektes, da Objekt noch nicht enthalten ist.
			kursliste.addElement(kurs);
		} else {
			// Fehlerausgabe, da Objekt schon enthalten.
			System.out
					.println("Fehler! Kursobjekt mit der Attributsbelegung Namen '"
							+ kurs.getName() + "' schon enthalten");
		}

	}

	/**
	 * Methode zum Loeschen von uebergebenen Kursobjekten.
	 * 
	 * @param kurs
	 *            (Kurs) der zu loeschende Kurs.
	 */
	public void removeElement(Kurs kurs) {
		// Abfrage ob ein Objekt schon im Vector enthalten ist.
		if (kursliste.contains(kurs)) {
			// loeschen des Objektes
			kursliste.removeElement(kurs);// (kurs);
		} else {
			// Fehlerausgabe, da Objekt schon enthalten.
			// die folgende Zeile erzeugt ein Fehlerfenster
			JOptionPane.showMessageDialog(null,
					"Das Kursobjekt ist schon enthalten!", "addKurs Fehler",
					JOptionPane.ERROR_MESSAGE);
			// die folgende Zeile erzeugt eine Terminalfensterausgabe
			System.out
					.println("Fehler! Kursobjekt mit der Attributsbelegung Namen '"
							+ kurs.getName() + "' schon enthalten");
		}

	}

	/**
	 * Diese Methode loescht den uebergebenen Kurs aus der Kursliste
	 * 
	 * @author max bogner
	 * 
	 * @param kurs
	 *            : Kurs der geloescht werden soll
	 */
	public void removeKursByKursId(Kurs kurs) {
		for (int i = 0; i < kursliste.size(); i++) {
			if (kurs.getKursid() == kursliste.elementAt(i).getKursid()) {

				kursliste.removeElementAt(i);

			}
		}

	}

	/**
	 * Gibt die Anzahl der Kursobjekte in der Kursliste zurueck.
	 * 
	 * @author Kerstin Schulze
	 * @return (in) - Anzahl der Elemente in Vector als int.
	 */
	public int anzKurse() {
		return kursliste.size();
	}

	/**
	 * Methode zur Rueckgabe von Kursobjekten anhand von Index.
	 * 
	 * @author Kerstin Schulze
	 * 
	 * @param in_Nummer
	 *            (int) - Index
	 * @return (Kurs)- Kursobjekt am Index
	 */
	public Kurs getKursAtId(int in_Nummer) {
		return (Kurs) kursliste.elementAt(in_Nummer);
	}

	/**
	 * darf nicht auf nicht unique kurslisten angewendet werden Ermittelt den
	 * Kurs anhand der kursid
	 * 
	 * @author max bogner
	 * @param in_Nummer
	 * @return Kurs: Gibt den ermittelten Kurs zurück
	 */
	public Kurs getKursImproved(int in_Nummer) {
		Kurs kl = new Kurs();
		for (int i = 0; i < kursliste.size(); i++) {
			if (kursliste.elementAt(i).getKursid() == in_Nummer) {
				kl = kursliste.elementAt(i);
			}
		}
		return kl;

	}

	/**
	 * ToString Methode fuer Kurslisten, wird fuer die Ausgabe der Kurslisten
	 * als String bzw. zum Schreiben in die Dateien verwendet.
	 * 
	 * @return str (String) der Ausgabestring
	 * @author max bogner
	 */
	public String toString() {
		String str = new String();
		if (kursliste.size() > 0) {
			// Schleife, die alle Objekte der Studentenliste durchlaeuft
			for (Enumeration e = kursliste.elements(); e.hasMoreElements();) {
				// Ausgeben des aktuellen Studenten im Terminalfenster.
				// durch 'nextElement()' wird das naechste Objekt aufgerufen.
				Kurs kurs = (Kurs) e.nextElement();
				int kursid = kurs.getKursid();
				String name = kurs.getName();
				String kurzname = kurs.getKurzname();

				// String str = new String();
				str = str + kurzname + "-" + name + "\n";

				// System.out.println("Kursid: "+ kursid+ " Name: " + name);
			}
		} else {
			str = "Die Kursliste konnte nicht ausgegeben werden" + "\n";

		}

		return str;
	}

	/**
	 * 
	 * 
	 * ToString Methode fuer Kurslisten, wird fuer die Ausgabe der Kurslisten
	 * als String bzw. zum Schreiben in die Dateien verwendet.
	 * 
	 * @author max bogner
	 * @return str (String) der Ausgabestring
	 */
	public String toStringShort() {
		String str = new String();
		if (kursliste.size() > 0) {

			str = str + "(";

			for (int i = 0; i < kursliste.size(); i++) {
				Kurs kurs = kursliste.elementAt(i);
				int kursid = kurs.getKursid();
				String name = kurs.getName();
				String kurzname = kurs.getKurzname();

				if (i == 0) {
					str = str + kurzname;
				} else {
					str = str + ", " + kurzname;
				}

			}
			str = str + ")";
		} else {
			str = "Es wurden keine Kurse gebucht";

		}

		return str;
	}
	/**
	 * Diese Methode macht die Kursliste einzigartig.
	 * Somit enthaelt die Methode keine doppelten Eintraege mehr.
	 * Diese Methode erwartet eine sortierte kursliste (nach kursid)
	 * @author Max Bogner
	 */

	public void makeUnique() {
		Vector<Kurs> UniqueKursliste = new Vector<Kurs>();
		//Kursliste enthaelt mehr als einen Kurs
		if (kursliste.size() > 0) {
			int init = -99;
			for (int i = 0; i < kursliste.size() - 1; i++) {
				//am Anfang den ersten Eintrag zur Kursliste hinzufaegen
				if(init ==-99){
					UniqueKursliste.add(kursliste.elementAt(i));
					init =0;
				}
				int cid = kursliste.elementAt(i).getKursid();
				int nid = kursliste.elementAt(i + 1).getKursid();
				//ueberpruefen ob der derzeitige und der naechste kurs in der liste ungleich sind
				//wenn ja wird der kurs der neuen kursliste hinzugefuegt
				if (cid != nid) {
					UniqueKursliste.add(kursliste.elementAt(i + 1));
				}
			}
			// Kursliste enthaelt nur eine Eintrag
		}else{
			UniqueKursliste.add(kursliste.elementAt(0));
		}
		//Alle Eintraege der kursliste loeschen
		kursliste.removeAllElements();
		//erstellte Kursliste uebergeben
		kursliste = UniqueKursliste;
	}

}
